package org.alwayssuper.protocol.commons.transform.realtimev2016.enums;

/**
 * 实时信息类型标志枚举 (实时信息上报 0x02)
 * 基于 GB/T 32960.3-2016 标准
 * @author alwaysSuper
 */
public enum RealTimeInfoType {
    VEHICLE_DATA(0x01, "整车数据", "车辆状态、SOC等", true),
    DRIVE_MOTOR_DATA(0x02, "驱动电机数据", "电机状态、转速等", false),
    FUEL_CELL_DATA(0x03, "燃料电池数据", "燃料电池相关", false),
    ENGINE_DATA(0x04, "发动机数据", "发动机相关", false),
    VEHICLE_POSITION_DATA(0x05, "车辆位置数据", "GPS位置信息", false),
    EXTREME_DATA(0x06, "极值数据", "最高/最低温度电压", false),
    ALARM_DATA(0x07, "报警数据", "故障报警信息", false),
    
    // 预留和自定义类型
    TERMINAL_RESERVED_1(0x08, "终端数据预留1", "终端预留", false),
    TERMINAL_RESERVED_2(0x09, "终端数据预留2", "终端预留", false),
    
    // 平台交换协议自定义数据范围 0x0A~0x2F
    PLATFORM_CUSTOM_START(0x0A, "平台自定义数据开始", "平台自定义", false),
    PLATFORM_CUSTOM_END(0x2F, "平台自定义数据结束", "平台自定义", false),
    
    // 用户自定义数据范围 0x80~0xFE  
    USER_CUSTOM_START(0x80, "用户自定义数据开始", "用户自定义", false),
    USER_CUSTOM_END(0xFE, "用户自定义数据结束", "用户自定义", false);

    private final int typeCode;
    private final String typeName;
    private final String description;
    private final boolean mandatory; // 是否为必须字段

    RealTimeInfoType(int typeCode, String typeName, String description, boolean mandatory) {
        this.typeCode = typeCode;
        this.typeName = typeName;
        this.description = description;
        this.mandatory = mandatory;
    }

    public int getTypeCode() {
        return typeCode;
    }

    public String getTypeName() {
        return typeName;
    }

    public String getDescription() {
        return description;
    }

    public boolean isMandatory() {
        return mandatory;
    }

    public static RealTimeInfoType fromTypeCode(int typeCode) {
        for (RealTimeInfoType type : values()) {
            if (type.typeCode == typeCode) {
                return type;
            }
        }
        // 处理范围类型
        if (typeCode >= 0x0A && typeCode <= 0x2F) {
            return PLATFORM_CUSTOM_START; // 返回平台自定义类型代表
        }
        if (typeCode >= 0x80 && typeCode <= 0xFE) {
            return USER_CUSTOM_START; // 返回用户自定义类型代表
        }
        return null; // 未知类型
    }

    /**
     * 检查是否为平台自定义类型
     * @param typeCode 类型码
     * @return true=平台自定义类型
     */
    public static boolean isPlatformCustom(int typeCode) {
        return typeCode >= 0x0A && typeCode <= 0x2F;
    }

    /**
     * 检查是否为用户自定义类型
     * @param typeCode 类型码
     * @return true=用户自定义类型
     */
    public static boolean isUserCustom(int typeCode) {
        return typeCode >= 0x80 && typeCode <= 0xFE;
    }

    /**
     * 停车充电时不需要传输的数据类型
     * @return 不需要传输的类型列表
     */
    public static RealTimeInfoType[] getExcludedTypesForParkingCharge() {
        return new RealTimeInfoType[]{DRIVE_MOTOR_DATA, ENGINE_DATA};
    }

    @Override
    public String toString() {
        return String.format("RealTimeInfoType{typeCode=0x%02X, typeName='%s', description='%s', mandatory=%s}", 
                           typeCode, typeName, description, mandatory);
    }
}